home *** CD-ROM | disk | FTP | other *** search
/ Software of the Month Club 2000 October / Software of the Month - Ultimate Collection Shareware 277.iso / pc / PROGRAMS / UTILITY / WINLINUX / DATA1.CAB / programs_-_include / LINUX / SIGNAL.H < prev    next >
C/C++ Source or Header  |  1999-09-17  |  5KB  |  213 lines

  1. #ifndef _LINUX_SIGNAL_H
  2. #define _LINUX_SIGNAL_H
  3.  
  4. #include <asm/signal.h>
  5. #include <asm/siginfo.h>
  6.  
  7. #ifdef __KERNEL__
  8. /*
  9.  * Real Time signals may be queued.
  10.  */
  11.  
  12. struct signal_queue
  13. {
  14.     struct signal_queue *next;
  15.     siginfo_t info;
  16. };
  17.  
  18. /*
  19.  * Define some primitives to manipulate sigset_t.
  20.  */
  21.  
  22. #ifndef __HAVE_ARCH_SIG_BITOPS
  23. #include <asm/bitops.h>
  24.  
  25. /* We don't use <asm/bitops.h> for these because there is no need to
  26.    be atomic.  */
  27. extern inline void sigaddset(sigset_t *set, int _sig)
  28. {
  29.     unsigned long sig = _sig - 1;
  30.     if (_NSIG_WORDS == 1)
  31.         set->sig[0] |= 1UL << sig;
  32.     else
  33.         set->sig[sig / _NSIG_BPW] |= 1UL << (sig % _NSIG_BPW);
  34. }
  35.  
  36. extern inline void sigdelset(sigset_t *set, int _sig)
  37. {
  38.     unsigned long sig = _sig - 1;
  39.     if (_NSIG_WORDS == 1)
  40.         set->sig[0] &= ~(1UL << sig);
  41.     else
  42.         set->sig[sig / _NSIG_BPW] &= ~(1UL << (sig % _NSIG_BPW));
  43. }
  44.  
  45. extern inline int sigismember(sigset_t *set, int _sig)
  46. {
  47.     unsigned long sig = _sig - 1;
  48.     if (_NSIG_WORDS == 1)
  49.         return 1 & (set->sig[0] >> sig);
  50.     else
  51.         return 1 & (set->sig[sig / _NSIG_BPW] >> (sig % _NSIG_BPW));
  52. }
  53.  
  54. extern inline int sigfindinword(unsigned long word)
  55. {
  56.     return ffz(~word);
  57. }
  58.  
  59. #define sigmask(sig)    (1UL << ((sig) - 1))
  60.  
  61. #endif /* __HAVE_ARCH_SIG_BITOPS */
  62.  
  63. #ifndef __HAVE_ARCH_SIG_SETOPS
  64. #include <linux/string.h>
  65.  
  66. #define _SIG_SET_BINOP(name, op)                    \
  67. extern inline void name(sigset_t *r, const sigset_t *a, const sigset_t *b) \
  68. {                                    \
  69.     unsigned long a0, a1, a2, a3, b0, b1, b2, b3;            \
  70.     unsigned long i;                        \
  71.                                     \
  72.     for (i = 0; i < _NSIG_WORDS/4; ++i) {                \
  73.         a0 = a->sig[4*i+0]; a1 = a->sig[4*i+1];            \
  74.         a2 = a->sig[4*i+2]; a3 = a->sig[4*i+3];            \
  75.         b0 = b->sig[4*i+0]; b1 = b->sig[4*i+1];            \
  76.         b2 = b->sig[4*i+2]; b3 = b->sig[4*i+3];            \
  77.         r->sig[4*i+0] = op(a0, b0);                \
  78.         r->sig[4*i+1] = op(a1, b1);                \
  79.         r->sig[4*i+2] = op(a2, b2);                \
  80.         r->sig[4*i+3] = op(a3, b3);                \
  81.     }                                \
  82.     switch (_NSIG_WORDS % 4) {                    \
  83.         case 3:                            \
  84.         a0 = a->sig[4*i+0]; a1 = a->sig[4*i+1]; a2 = a->sig[4*i+2]; \
  85.         b0 = b->sig[4*i+0]; b1 = b->sig[4*i+1]; b2 = b->sig[4*i+2]; \
  86.         r->sig[4*i+0] = op(a0, b0);                \
  87.         r->sig[4*i+1] = op(a1, b1);                \
  88.         r->sig[4*i+2] = op(a2, b2);                \
  89.         break;                            \
  90.         case 2:                            \
  91.         a0 = a->sig[4*i+0]; a1 = a->sig[4*i+1];            \
  92.         b0 = b->sig[4*i+0]; b1 = b->sig[4*i+1];            \
  93.         r->sig[4*i+0] = op(a0, b0);                \
  94.         r->sig[4*i+1] = op(a1, b1);                \
  95.         break;                            \
  96.         case 1:                            \
  97.         a0 = a->sig[4*i+0]; b0 = b->sig[4*i+0];            \
  98.         r->sig[4*i+0] = op(a0, b0);                \
  99.         break;                            \
  100.     }                                \
  101. }
  102.  
  103. #define _sig_or(x,y)    ((x) | (y))
  104. _SIG_SET_BINOP(sigorsets, _sig_or)
  105.  
  106. #define _sig_and(x,y)    ((x) & (y))
  107. _SIG_SET_BINOP(sigandsets, _sig_and)
  108.  
  109. #define _sig_nand(x,y)    ((x) & ~(y))
  110. _SIG_SET_BINOP(signandsets, _sig_nand)
  111.  
  112. #undef _SIG_SET_BINOP
  113. #undef _sig_or
  114. #undef _sig_and
  115. #undef _sig_nand
  116.  
  117. #define _SIG_SET_OP(name, op)                        \
  118. extern inline void name(sigset_t *set)                    \
  119. {                                    \
  120.     unsigned long i;                        \
  121.                                     \
  122.     for (i = 0; i < _NSIG_WORDS/4; ++i) {                \
  123.         set->sig[4*i+0] = op(set->sig[4*i+0]);            \
  124.         set->sig[4*i+1] = op(set->sig[4*i+1]);            \
  125.         set->sig[4*i+2] = op(set->sig[4*i+2]);            \
  126.         set->sig[4*i+3] = op(set->sig[4*i+3]);            \
  127.     }                                \
  128.     switch (_NSIG_WORDS % 4) {                    \
  129.         case 3: set->sig[4*i+2] = op(set->sig[4*i+2]);        \
  130.         case 2: set->sig[4*i+1] = op(set->sig[4*i+1]);        \
  131.         case 1: set->sig[4*i+0] = op(set->sig[4*i+0]);        \
  132.     }                                \
  133. }
  134.  
  135. #define _sig_not(x)    (~(x))
  136. _SIG_SET_OP(signotset, _sig_not)
  137.  
  138. #undef _SIG_SET_OP
  139. #undef _sig_not
  140.  
  141. extern inline void sigemptyset(sigset_t *set)
  142. {
  143.     switch (_NSIG_WORDS) {
  144.     default:
  145.         memset(set, 0, sizeof(sigset_t));
  146.         break;
  147.     case 2: set->sig[1] = 0;
  148.     case 1:    set->sig[0] = 0;
  149.         break;
  150.     }
  151. }
  152.  
  153. extern inline void sigfillset(sigset_t *set)
  154. {
  155.     switch (_NSIG_WORDS) {
  156.     default:
  157.         memset(set, -1, sizeof(sigset_t));
  158.         break;
  159.     case 2: set->sig[1] = -1;
  160.     case 1:    set->sig[0] = -1;
  161.         break;
  162.     }
  163. }
  164.  
  165. extern char * render_sigset_t(sigset_t *set, char *buffer);
  166.  
  167. /* Some extensions for manipulating the low 32 signals in particular.  */
  168.  
  169. extern inline void sigaddsetmask(sigset_t *set, unsigned long mask)
  170. {
  171.     set->sig[0] |= mask;
  172. }
  173.  
  174. extern inline void sigdelsetmask(sigset_t *set, unsigned long mask)
  175. {
  176.     set->sig[0] &= ~mask;
  177. }
  178.  
  179. extern inline int sigtestsetmask(sigset_t *set, unsigned long mask)
  180. {
  181.     return (set->sig[0] & mask) != 0;
  182. }
  183.  
  184. extern inline void siginitset(sigset_t *set, unsigned long mask)
  185. {
  186.     set->sig[0] = mask;
  187.     switch (_NSIG_WORDS) {
  188.     default:
  189.         memset(&set->sig[1], 0, sizeof(long)*(_NSIG_WORDS-1));
  190.         break;
  191.     case 2: set->sig[1] = 0;
  192.     case 1:
  193.     }
  194. }
  195.  
  196. extern inline void siginitsetinv(sigset_t *set, unsigned long mask)
  197. {
  198.     set->sig[0] = ~mask;
  199.     switch (_NSIG_WORDS) {
  200.     default:
  201.         memset(&set->sig[1], -1, sizeof(long)*(_NSIG_WORDS-1));
  202.         break;
  203.     case 2: set->sig[1] = -1;
  204.     case 1:
  205.     }
  206. }
  207.  
  208. #endif /* __HAVE_ARCH_SIG_SETOPS */
  209.  
  210. #endif /* __KERNEL__ */
  211.  
  212. #endif /* _LINUX_SIGNAL_H */
  213.